import {getNewCartGoods} from '@/api/cart'

// 购物车模块
export default {
    // 命名空间
    namespaced: true,
    state() {
        return {
            // 用户信息
            list: []
        }
    },
    getters:{
        //有效商品列表
        validList(state){
            return state.list.filter(goods=>goods.stock>0 && goods.isEffective)
        },
        //有效商品总件数
        validTotal(state,getters){
            return getters.validList.reduce((p,c)=>p+c.count,0)
        },
        //有效商品总金额
        validAmount(state,getters){
            return getters.validList.reduce((p,c)=>p+c.nowPrice*100*c.count,0)/100
        },
        //无效商品列表
        invalidList(state){
            return state.list.filter(goods=>goods.stock<=0 || !goods.isEffective)
        },
        //已选商品列表
        selectedList(state,getters){
            return getters.validList.filter(item=>item.selected)
        },
        //已选商品总件数
        selectedTotal(state,getters){
            return getters.selectedList.reduce((p,c)=>p+c.count,0)
        },
        //已选商品总金额
        selectedAmount(state,getters){
            return getters.selectedList.reduce((p,c)=>p+c.nowPrice*100*c.count,0)/100 
        },
        //是否全选
        isCheckAll(state,getters){
            return getters.validList!==0 && getters.selectedList.length===getters.validList.length
        }
    },
    mutations: {
        //加入购物车
        insertCart(state, payload) {
            //约定加入购物车字段必须和后端保持一致  payload对象的字段
            //它们是：id name picture price count skuId attrsText selected nowPrice stock（库存） isEffective（是否为有效商品）
            //插入数据规则：
            //1.先找下是否有相同商品
            //2.如果有相同商品，查询它的数量，累加到payload上，再保存到最新位置,原来的商品需要删除
            //3.如果没有相同的商品，保存在最新位置即可
            const sameIndex = state.list.findIndex(goods => goods.skuId === payload.skuId)
                // 有相同的商品
            if (sameIndex > -1) {
                const count = state.list[sameIndex].count
                payload.count += count
                    //删除原来的
                state.list.splice(sameIndex, 1)
            }
            //追加新的
            state.list.unshift(payload)
        },
        //修改购物车商品
        updateCart(state,goods){
            //goods 商品信息：nowPrice stock isEffective
            //goods 商品对象的字段不固定，对象中有那些字段就改哪些字段，字段值合法时才改
            //goods 商品对象必须有skuId
            const updateGoods=state.list.find(item=>item.skuId===goods.skuId)
            for(const key in goods){
                if(goods[key]!==undefined && goods[key]!==null && goods[key]!==''){
                    updateGoods[key]=goods[key]
                }
            }
        },
        deleteCart(state,skuId){
            const Index=state.list.findIndex(item=>item.skuId===skuId)
            state.list.splice(Index,1)
        }
    },
    actions: {
        //加入购物车
        insertCart(ctx, payload) {
            return new Promise((resolve, reject) => {
                if (ctx.rootState.user.profile.token) {
                    //已登录

                } else {
                    //未登录
                    ctx.commit('insertCart', payload)
                    resolve()
                }
            })

        },
        findCart(ctx) {
            return new Promise((resolve, reject) => {
                if (ctx.rootState.user.profile.token) {
                    //已登录

                } else {
                    //未登录
                    //同时发送请求（有几个商品发几个请求）等所有请求成功，一并去修改本地数据
                    //Promise.all(Promise数组).then((dataList)=>{})  同时发请求，所有请求成功，得到所有成功结果
                    //Promise.resolve() Promise.reject() new Promise()
                    //Promise.race(Promise数组).then((data)=>{}) 同时发请求，最快的请求成功，得到成功结果
                    const promiseArr=ctx.state.list.map(goods=>{
                        return getNewCartGoods(goods.skuId)
                    })
                    Promise.all(promiseArr).then(results=>{
                        console.log(results);
                        //更新本地购物车
                        //调用resolve代表操作成功
                        resolve()
                    })
                }
            })
        },
        deleteCart(ctx, payload) {
            return new Promise((resolve, reject) => {
                if (ctx.rootState.user.profile.token) {
                    //已登录

                } else {
                    //未登录
                    //单条删除 payload 现在 就是skuId
                    ctx.commit('deleteCart', payload)
                    resolve()
                }
            })

        },
        //修改购物车（选中状态，数量）
        updateCart(ctx, payload) {
            //payload 需要：必需有skuId 可能：select count
            return new Promise((resolve, reject) => {
                if (ctx.rootState.user.profile.token) {
                    //已登录

                } else {
                    //未登录
                    ctx.commit('updateCart', payload)
                    resolve()
                }
            })

        },
        //全选与取消全选
        checkAllCart(ctx,selected){
            return new Promise((resolve, reject) => {
                if (ctx.rootState.user.profile.token) {
                    //已登录

                } else {
                    //未登录
                    ctx.getters.validList.forEach(goods=>{
                        ctx.commit('updateCart',{skuId:goods.skuId,selected})
                    })
                    resolve()
                }
            })
        }

    }

}